package serialize

import (
	"bytes"
	"encoding/gob"
	"log"
)

type GobSerializer[T any] struct {
}

func (gs GobSerializer[T]) Serialize(obj T) ([]byte, error) {
	var buf bytes.Buffer
	encoder := gob.NewEncoder(&buf) // 构造编码器，并把数据写进buf中
	if err := encoder.Encode(&obj); err != nil {
		log.Printf("encode error: %v\n", err)
		return nil, err
	}
	return buf.Bytes(), nil
}

func (gs GobSerializer[T]) Deserialize(data []byte, obj T) (T, error) {
	//var buf bytes.Buffer
	bufPtr := bytes.NewBuffer(data)   // 返回的类型是 *Buffer，而不是 Buffer。注意一下
	decoder := gob.NewDecoder(bufPtr) // 从 bufPtr 中获取数据
	err := decoder.Decode(&obj)
	return obj, err
}
